package cn.edu.lzzy.utils;

import cn.edu.lzzy.entities.User;
import cn.edu.lzzy.vm.VmUser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Stream;

/**
 * 认真组件
 */
@Component
public class AuthUtils {
    private static int minutes;//会话时间

    public static final List<VmUser> USERS=new ArrayList<>();

    /**
     * 超时登录用户
     * 当超时时，返回true值，否则返回false
     */
    public static boolean isOverTime(VmUser user){
        long offMillis = System.currentTimeMillis() - user.getLastLogin().getTime();
        long minutes = offMillis / (1000 * 60);
        boolean overStatus = minutes > AuthUtils.minutes;
        if (overStatus) {
            USERS.remove(user);
        }
        return overStatus;
    }

    /**
     * 判断当前用户的合法性
     * 根据授权角色信息针对token进行判断
     * 返回true值，非法角色，否则是合法用户
     */
    public static boolean illegalUser(String token,int [] allowRoles){
        VmUser vmUser = USERS.stream()
                .filter(user->user.getToken().equals(token))
                .findAny()
                .orElse(null);
        if(vmUser==null || isOverTime(vmUser)){
            return true;
        }
        vmUser.setLastLogin(new Date());
        return Arrays.stream(allowRoles).noneMatch(x ->x==vmUser.getType());
    }

    /**
     * 获取用户
     */

    public static VmUser getUser(String token){
        VmUser vmUser = USERS.stream()
                .filter(user->user.getToken().equals(token))
                .findAny()
                .orElse(null);
        return vmUser;
    }



    @Value("${app.over.minute}")
    public void setMinutes(){
        AuthUtils.minutes=minutes;
    }

    /**
     * 验证当前操作的用户是否是用户本人
     * @param userid
     * @param token
     * 如果userid == token 中的id ,表明是同一用户
     * 否则是不同用户
     * @return
     */
    public static boolean invalid(UUID userid,String  token){
        VmUser vmUser = getUser(token);
        if(vmUser==null || isOverTime(vmUser)){
            return true;
        }
        boolean validUserid = vmUser.getId().equals(userid);
        if(validUserid){
            vmUser.setLastLogin(new Date());
        }
        return !validUserid;
    }

    /**
     * 验证当前操作用户是否是非超时，合法用户
     * 如果是，做清除用户信息处理，否则，不做处理
     * @param token
     * @return
     */
    public static String logout(String token){
        VmUser vmUser = USERS.stream()
                .filter(user -> user.getToken().equals(token))
                .findAny()
                .orElse(null);
        USERS.remove(vmUser);
        return "用户注销成功！";
    }
    public static List<Integer> getRoles(int value){
        List<Integer> result=new ArrayList<>();
        String strBinary=StringUtils.padLeft(Integer.toBinaryString(value), User.COUNT_TYPE,'0');
        int a=0;
        for (char b: strBinary.toCharArray()) {
            if(b== '1'){
                result.add(a);
            }
        }
        return result;
    }

    /**
     * 获取认证信息
     */
public static int getAuthValue(String stringBinary){
    return Integer.valueOf(stringBinary,2);
}
public static int getDefaultAuthValue(){
    String strBinary=StringUtils.padRight("",User.COUNT_TYPE,'1');
    return Integer.valueOf(strBinary,2);
}
//setMinutes
public void setMinutes(int minutes){
    AuthUtils.minutes=minutes;
}




}
